package com.hsy.crm.web.utils;

import com.google.common.collect.Maps;

import java.util.Map;

/**
 * 带过期的内存缓存
 * 过期时间参数 单位毫秒
 */
public class ExpiryMap {

    /**
     * 记录数据map
     */
    private static final Map<String,Object> dataMap = Maps.newHashMap();

    /**
     * 记录时间map
     */
    private static final Map<String,Long> timeMap = Maps.newHashMap();

    /**
     * 毫秒
     * @param key
     * @param value
     * @param expiry
     */
    public static void put(String key,Object value,long expiry){
        dataMap.put(key,value);
        timeMap.put(key,millis(expiry));
    }

    public static void put(String key,Object value){
        dataMap.put(key,value);
    }

    public static void remove(String key){
        dataMap.remove(key);
        timeMap.remove(key);
    }

    /**
     * 判断是否过期  过期则清空map并返回null   未过期则返回值
     */
    public static Object get(String key){
        if( isExpiry(key) ){
            remove(key);
            return null;
        }else{
            return dataMap.get(key);
        }
    }

    /**
     * 判断键是否过期
     */
    private static boolean isExpiry(String key){
        Long time = timeMap.get(key);
        if( time == null ){
            return false;
        }else{
            return isTimeExpiry(time);
        }
    }

    /**
     * 判断是否到了过期时间
     */
    private static boolean isTimeExpiry(long time){
        return time <= System.currentTimeMillis();
    }

    /**
     * 过期后未调用get方法则一直不会被清理，则需要定时清理过期数据
     */
    public static void clear(){
        for(Map.Entry<String, Long> entry : timeMap.entrySet()){
            String key = entry.getKey();
            Long value = entry.getValue();

            if( isTimeExpiry(value) ){
                remove(key);
            }
        }
    }

    private static Long millis(long expiry){
        return System.currentTimeMillis()+expiry;
    }

}